home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / news / nntp / nntplink3.1.0 / article.c next >
Encoding:
C/C++ Source or Header  |  1992-10-25  |  7.7 KB  |  332 lines

  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include "conf.h"
  4. #ifdef FAKESYSLOG
  5. #include "fsyslog.h"
  6. #else
  7. #include <syslog.h>
  8. #endif
  9. #ifdef HAVE_STRING_H
  10. #include <string.h>
  11. #else
  12. #include <strings.h>
  13. #endif
  14. #include <sys/stat.h>
  15. #include <sys/time.h>
  16. #include "readline.h"
  17. #include "nntplink.h"
  18. #include "strfuns.h"
  19.  
  20. extern char *E_fdopen;
  21. extern char *E_open;
  22.  
  23. extern Boolean Abort_signaled;
  24. extern Boolean Debug;
  25. extern int Dtablesize;
  26. extern long Entry_sleep;
  27. extern long Idle_time;
  28. extern int Input_from;
  29. extern Boolean One_shot;
  30. extern Boolean Save_fails;
  31.  
  32. extern char *E_fopen;
  33. extern char *E_unlink;
  34.  
  35. #ifdef LOOKUP_ARTICLE
  36. extern void close_history();
  37. extern char *get_history_entry();
  38. #endif
  39.  
  40. extern void check_sleep();
  41. extern void close_article();
  42. extern void fail();
  43. extern void log();
  44. extern Boolean parse_entry();
  45.  
  46.  
  47. Boolean
  48.   get_next_art()
  49. {
  50.     static char *fname = "get_next_art: ";
  51.     FILE *tmpfp;
  52.     struct stat batch_stat;
  53.     char *entry;
  54.     int already = 0;
  55.     static int batch_lines = 20;
  56.  
  57.     if (Article.count >= MAX_ART_FAILS) {
  58.  
  59.     if (Save_fails) {
  60.  
  61. #ifdef LOOKUP_ARTICLE
  62.         Article.filename = strsave("/");
  63.         if (Article.err != NULL)
  64.           log(LOG_NOTICE, fname, "%s%s: article %s failed(saved): %s\n",
  65.           Host.name, Article.mesgid, Article.err);
  66.         else
  67.           log(LOG_NOTICE, fname, "%s%s: article %s failed(saved)\n",
  68.           Host.name, Article.mesgid);
  69. #else
  70.         if (Article.err != NULL)
  71.           log(LOG_NOTICE, fname, "%s%s: article %s failed(saved): %s\n",
  72.           Host.name, Article.filename, Article.err);
  73.         else
  74.           log(LOG_NOTICE, fname, "%s%s: article %s failed(saved)\n",
  75.           Host.name, Article.filename);
  76. #endif
  77.  
  78.         if ((tmpfp = fopen(Host.failfile, "a")) == NULL)
  79.           log(LOG_WARNING, fname, E_fopen, Host.name, Host.failfile, "a",
  80.           errmsg(errno));
  81.         else {
  82. #ifdef BNEWS
  83.         fprintf(tmpfp, "%s\t%s\t%d\n", Article.filename,
  84.             Article.mesgid,    Article.count);
  85. #else
  86.         fprintf(tmpfp, "%s %s %d\n", Article.filename, Article.mesgid,
  87.             Article.count);
  88. #endif
  89.         FCLOSE(tmpfp);
  90.         }
  91.     } else
  92.       if (Article.err != NULL)
  93.         log(LOG_NOTICE, fname, "%s%s: article %s failed(junked): %s\n",
  94.         Host.name, Article.filename, Article.err);
  95.       else
  96.         log(LOG_NOTICE, fname, "%s%s: article %s failed(junked)\n",
  97.         Host.name, Article.filename);
  98.  
  99.     close_article();
  100.     }
  101.  
  102.     if (Article.mesgid != NULL || Article.filename != NULL)
  103.       return TRUE;
  104.  
  105.     if (Batchfile.use) {
  106.  
  107.     if (Debug)
  108.       if (Batchfile.nntp_in_use)
  109.         log(LOG_DEBUG, fname,
  110.         "%sretrieving article from batchfile.nntp\n");
  111.       else
  112.         log(LOG_DEBUG, fname, "%sretrieving article from batchfile\n");
  113.  
  114.     Batchfile.offset = fb_tell(Batchfile.fbp);
  115.  
  116.     if (!Batchfile.nntp_in_use) {
  117.       if (!One_shot) {
  118.         dlog(LOG_DEBUG, fname, "%swaiting for entry: ");
  119.         while (((entry = fb_readline(Batchfile.fbp, NULL)) == NULL)
  120.            && fb_eof(Batchfile.fbp) && !Batchfile.nntp_in_use)
  121.           check_sleep(Entry_sleep, CREATE_BATCH);
  122.  
  123.         if (entry == NULL) {
  124.           if (fb_error(Batchfile.fbp))
  125.         log(LOG_WARNING, fname,
  126.             "%s%s: error reading %s: %s\n", Host.name,
  127.             Batchfile.name, errmsg(errno));
  128.           return FALSE;
  129.         }
  130.       } else
  131.         if ((entry = fb_readline(Batchfile.fbp, NULL)) == NULL) {
  132.           if (Debug)
  133.         if (fb_eof(Batchfile.fbp))
  134.           log(LOG_DEBUG, fname,
  135.               "%sbatchfile at EOF - removing and exiting\n");
  136.         else
  137.           log(LOG_DEBUG, fname,
  138.               "%serror reading batchfile: %s\n",
  139.               errmsg(errno));
  140.           close(fb_fileno(Batchfile.fbp));
  141.           fb_close(Batchfile.fbp);
  142.           Batchfile.inode = Batchfile.offset = 0;
  143.           if (unlink(Batchfile.name) == FAIL)
  144.         log(LOG_WARNING, fname, E_unlink, Host.name,
  145.             Batchfile.name, errmsg(errno));
  146.           Abort_signaled = TRUE;
  147.           return FALSE;
  148.         }
  149.     } else {
  150.  
  151.       while(((entry = fb_readline(Batchfile.fbp, NULL)) == NULL) &&
  152.         fb_eof(Batchfile.fbp)) {
  153.         if (!(Input_from & FLG_BATCHFILE) ||
  154.         (stat(Batchfile.name, &batch_stat) != FAIL)) {
  155.  
  156.           dlog(LOG_DEBUG, fname,
  157.            "%sbatchfile.nntp at EOF - removing\n");
  158.  
  159.           close(fb_fileno(Batchfile.fbp));
  160.           Batchfile.inode = Batchfile.offset = 0;
  161.           fb_close(Batchfile.fbp);
  162.           Batchfile.fbp = NULL;
  163.           Batchfile.nntp_in_use = FALSE;
  164.  
  165.           if (unlink(Batchfile.nname) == FAIL)
  166.         log(LOG_WARNING, fname, E_unlink, Host.name,
  167.             Batchfile.nname, errmsg(errno));
  168.  
  169.           return FALSE;
  170.         }
  171.  
  172.         if (Debug && !already++)
  173.           log(LOG_DEBUG, fname, "%sbatchfile.nntp at EOF: ");
  174.  
  175.         check_sleep(Entry_sleep, CREATE_BATCH);
  176.       }
  177.  
  178.       if (fb_error(Batchfile.fbp))
  179.         fail(fname, "%s%s: error reading %s: %s\n", Host.name,
  180.          Batchfile.nname, errmsg(errno));
  181.  
  182.     }
  183.     dlog(LOG_DEBUG, "", "%sGot it\n");
  184.     return(parse_entry(entry));
  185.     }
  186.  
  187.     if (Input_from & FLG_LOGFILE) {
  188.  
  189.     dlog(LOG_DEBUG, fname,
  190.          "%sretrieving next article from logfile\n");
  191.  
  192.     if (!One_shot) {
  193.         dlog(LOG_DEBUG, fname, "%swaiting for entry: ");
  194.         for (;;) {
  195.         while (((entry = fb_readline(Logfile.fbp, NULL)) == NULL) &&
  196.                fb_eof(Logfile.fbp))
  197.           if (Batchfile.nntp_in_use)
  198.             return FALSE;
  199.           else
  200.             check_sleep(Entry_sleep, CREATE_BATCH);
  201.  
  202.         if (entry == NULL) {
  203.             log(LOG_WARNING, fname,
  204.             "%s%s: error reading %s: %s\n", Host.name,
  205.             Logfile.name, errmsg(errno));
  206.             return FALSE;
  207.         } else if (parse_entry(entry)) {
  208.               break;
  209.         }
  210.         }
  211.     } else {
  212.         while (((entry = fb_readline(Logfile.fbp, NULL)) != NULL) &&
  213.            (!parse_entry(entry)))
  214.            ;
  215.  
  216.         if (entry == NULL) {
  217.         if (Debug)
  218.           if (fb_eof(Logfile.fbp))
  219.             log(LOG_DEBUG, fname, "%sLogfile at EOF - exiting\n");
  220.           else
  221.             log(LOG_DEBUG, fname,
  222.             "%serror reading logfile: %s\n",
  223.             errmsg(errno));
  224.         Abort_signaled = TRUE;
  225.         return FALSE;
  226.         }
  227.     }
  228.  
  229.     } else if (Input_from & FLG_STDIN) {
  230.  
  231.       dlog(LOG_DEBUG, fname, "%swaiting for entry: ");
  232.       for (;;) {
  233.     while (((entry = fb_readline(Stdin, NULL)) == NULL) &&
  234.            (errno == READ_ERROR)) {
  235.       errno = 0;
  236.       if (Batchfile.nntp_in_use)
  237.         return FALSE;
  238.       else
  239.         check_sleep(Entry_sleep, !CREATE_BATCH);
  240.     }
  241.  
  242.     if (entry == NULL) {
  243.       if (fb_eof(Stdin))
  244.         log(LOG_DEBUG, fname, "%s%s: EOF on stdin, exiting\n", Host.name);
  245.       else
  246.         log(LOG_DEBUG, fname, "%serror reading stdin: %s\n",
  247.         errmsg(errno));
  248.       Abort_signaled = TRUE;
  249.       return FALSE;
  250.     } else if (parse_entry(entry)) {
  251.         break;
  252.     }
  253.       }
  254.     } else
  255.       fail(fname, "%s%s: Input_from has invalid value - exiting\n",
  256.        Host.name);
  257.  
  258.     dlog(LOG_DEBUG, "", "%sGot it\n");
  259.     return TRUE;
  260. }
  261.  
  262.  
  263. void
  264.   close_article()
  265. {
  266.     Article.filename = NULL;
  267.     Article.mesgid = NULL;
  268.  
  269.     if (Article.fbp != NULL) {
  270.     close(fb_fileno(Article.fbp));
  271.     fb_close(Article.fbp);
  272.     Article.fbp = NULL;
  273.     }
  274.  
  275.     if (Article.err != NULL)
  276.     FREE(Article.err);
  277.  
  278.     Article.count = 0;
  279.  
  280.     return;
  281. }
  282.  
  283.  
  284. Boolean
  285.   open_article()
  286. {
  287.     static char *fname = "open_article: ";
  288.     int fd;
  289.  
  290.     if (Article.fbp != NULL)
  291.       return TRUE;
  292.  
  293. #ifdef LOOKUP_ARTICLE
  294.     if (Article.filename == NULL) {
  295.  
  296.     Article.filename = get_history_entry(Article.mesgid, WANT_FILENAME);
  297.  
  298.     /*
  299.      * If we failed then we want to close the history file and retry
  300.      * since it's possible that the history file got aged.
  301.      */
  302.     if (Article.filename == NULL) {
  303.         close_history();
  304.         Article.filename = get_history_entry(Article.mesgid,
  305.                          WANT_FILENAME);
  306.         if (Article.filename == NULL) {
  307.         log(LOG_INFO, fname, "%s%s: Filename not found for %s\n",
  308.             Host.name, Article.mesgid);
  309.         return FALSE;
  310.         }
  311.     }
  312.  
  313.     dlog(LOG_DEBUG, fname, "%shistory returns %s\n", Article.filename);
  314.     }
  315. #endif /* LOOKUP_ARTICLE */
  316.  
  317.     if ((fd = open(Article.filename, O_RDONLY)) == FAIL) {
  318.     if (errno != ENOENT)
  319.       log(LOG_WARNING, fname, E_open, Host.name, Article.filename, "r",
  320.           errmsg(errno));
  321.     else
  322.       dlog(LOG_DEBUG, fname, "%sArticle(%s) not found\n",
  323.            Article.filename);
  324.  
  325.     return FALSE;
  326.     }
  327.  
  328.     Article.fbp = fb_fdopen(fd);
  329.  
  330.     return TRUE;
  331. }
  332.